package day1_array.my_array;

/**
 * @Author: yuisama
 * @Date: 2021/8/6 13:15
 * @Description:封装int类型的Array数组
 */
public class MyArray_Int {
    // 数组中实际的元素数量,size永远指向当前数组的尾元素的下一个空位置
    private int size;
    private int[] data;

    // 外部初始化数组存放元素数量
    public MyArray_Int(int size) {
        data = new int[size];
    }

    public MyArray_Int() {
        this(10);
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 在数组尾部插入元素
     * @param element 要插入的元素
     */
    public void addLast(int element) {
//        // 当前数组已满，无法插入新的元素
//        if (size == data.length) {
//            throw new ArrayIndexOutOfBoundsException("数组已满，无法插入新的元素");
//        }
//        data[size++] = element;
        addIndex(element,size);
    }

    /**
     * 数组头插
     * @param element
     */
    public void addFirst(int element) {
        addIndex(element,0);
    }

    /**
     * 在数组已存在元素的任意位置插入元素
     * @param element 要插入的新元素
     * @param index 要插入的位置
     */
    public void addIndex(int element,int index) {
        // 当前数组已满，无法插入新的元素
        if (size == data.length) {
            throw new ArrayIndexOutOfBoundsException("数组已满，无法插入新的元素");
        }
        // 判断索引是否合法
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("要插入的位置不存在，请在数组有效元素之间插入");
        }
        // 将要插入的位置之后的元素向后移动一个位置
        for (int i = size - 1; i >= index; i--) {
            data[i + 1] = data[i];
        }
        data[index] = element;
        size ++;
    }
}
